home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / split.py < prev    next >
Text File  |  2006-06-30  |  5KB  |  145 lines

  1. #!/usr/bin/python
  2. # Copyright (c) 2003 CORE Security Technologies
  3. #
  4. # This software is provided under under a slightly modified version
  5. # of the Apache Software License. See the accompanying LICENSE file
  6. # for more information.
  7. #
  8. # $Id: split.py,v 1.4 2003/10/27 17:36:56 jkohen Exp $
  9. #
  10. # Pcap dump splitter.
  11. #
  12. # This tools splits pcap capture files into smaller ones, one for each
  13. # different TCP/IP connection found in the original.
  14. #
  15. # Authors:
  16. #  Alejandro D. Weil <aweil@coresecurity.com>
  17. #  Javier Kohen <jkohen@coresecurity.com>
  18. #
  19. # Reference for:
  20. #  pcapy: open_offline, pcapdumper.
  21. #  ImpactDecoder.
  22.  
  23. import sys
  24. import string
  25. from exceptions import Exception
  26. from threading import Thread
  27.  
  28. import pcapy
  29. from pcapy import open_offline
  30. import impacket
  31. from impacket.ImpactDecoder import EthDecoder, LinuxSLLDecoder
  32.  
  33. class Connection:
  34.     """This class can be used as a key in a dictionary to select a connection
  35.     given a pair of peers. Two connections are considered the same if both
  36.     peers are equal, despite the order in which they were passed to the
  37.     class constructor.
  38.     """
  39.  
  40.     def __init__(self, p1, p2):
  41.         """This constructor takes two tuples, one for each peer. The first
  42.         element in each tuple is the IP address as a string, and the
  43.         second is the port as an integer.
  44.         """
  45.  
  46.         self.p1 = p1
  47.         self.p2 = p2
  48.  
  49.     def getFilename(self):
  50.         """Utility function that returns a filename composed by the IP
  51.         addresses and ports of both peers.
  52.         """
  53.         return '%s.%d-%s.%d.pcap'%(self.p1[0],self.p1[1],self.p2[0],self.p2[1])
  54.  
  55.     def __cmp__(self, other):
  56.         if ((self.p1 == other.p1 and self.p2 == other.p2)
  57.             or (self.p1 == other.p2 and self.p2 == other.p1)):
  58.             return 0
  59.         else:
  60.             return -1
  61.  
  62.     def __hash__(self):
  63.         return (hash(self.p1[0]) ^ hash(self.p1[1])
  64.                 ^ hash(self.p2[0]) ^ hash(self.p2[1]))
  65.  
  66.  
  67. class Decoder:
  68.     def __init__(self, pcapObj):
  69.         # Query the type of the link and instantiate a decoder accordingly.
  70.         datalink = pcapObj.datalink()
  71.         if pcapy.DLT_EN10MB == datalink:
  72.             self.decoder = EthDecoder()
  73.         elif pcapy.DLT_LINUX_SLL == datalink:
  74.             self.decoder = LinuxSLLDecoder()
  75.         else:
  76.             raise Exception("Datalink type not supported: " % datalink)
  77.  
  78.         self.pcap = pcapObj
  79.         self.connections = {}
  80.  
  81.     def start(self):
  82.         # Sniff ad infinitum.
  83.         # PacketHandler shall be invoked by pcap for every packet.
  84.         self.pcap.loop(0, self.packetHandler)
  85.  
  86.     def packetHandler(self, hdr, data):
  87.         """Handles an incoming pcap packet. This method only knows how
  88.         to recognize TCP/IP connections.
  89.         Be sure that only TCP packets are passed onto this handler (or
  90.         fix the code to ignore the others).
  91.  
  92.         Setting r"ip proto \tcp" as part of the pcap filter expression
  93.         suffices, and there shouldn't be any problem combining that with
  94.         other expressions.
  95.         """
  96.  
  97.         # Use the ImpactDecoder to turn the rawpacket into a hierarchy
  98.         # of ImpactPacket instances.
  99.         p = self.decoder.decode(data)
  100.         ip = p.child()
  101.         tcp = ip.child()
  102.  
  103.         # Build a distinctive key for this pair of peers.
  104.         src = (ip.get_ip_src(), tcp.get_th_sport() )
  105.         dst = (ip.get_ip_dst(), tcp.get_th_dport() )
  106.         con = Connection(src,dst)
  107.  
  108.         # If there isn't an entry associated yetwith this connection,
  109.         # open a new pcapdumper and create an association.
  110.         if not self.connections.has_key(con):
  111.             fn = con.getFilename()
  112.             print "Found a new connection, storing into:", fn
  113.             try:
  114.                 dumper = self.pcap.dump_open(fn)
  115.             except pcapy.PcapError, e:
  116.                 print "Can't write packet to:", fn
  117.                 return
  118.             self.connections[con] = dumper
  119.  
  120.         # Write the packet to the corresponding file.
  121.         self.connections[con].dump(hdr, data)
  122.  
  123.  
  124.  
  125. def main(filename):
  126.     # Open file
  127.     p = open_offline(filename)
  128.  
  129.     # At the moment the callback only accepts TCP/IP packets.
  130.     p.setfilter(r'ip proto \tcp')
  131.  
  132.     print "Reading from %s: linktype=%d" % (filename, p.datalink())
  133.  
  134.     # Start decoding process.
  135.     Decoder(p).start()
  136.  
  137.  
  138. # Process command-line arguments.
  139. if __name__ == '__main__':
  140.     if len(sys.argv) <= 1:
  141.         print "Usage: %s <filename>" % sys.argv[0]
  142.         sys.exit(1)
  143.  
  144.     main(sys.argv[1])
  145.